package com.bootdo.activity;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.junit.Before;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;
 /**
  *
  *  实例：
  *  比如进行“请假申请”的流程时候，
  *  最开始执行的就是提交”请假申请“，
  *  那么就需要知道，
  *  谁提交的“请假”，很明显，在一个系统中，
  *  谁登陆到系统里面，谁就有提交“请假任务”的提交人，
  *  那么执行人就可以确定就是登录人。
  *
　　* @author 郝江波
　　* @date 2019/8/19 16:01
　　*/
public class 任务的多种情况案例一 {
    @Before
    public void testCreateTablesAutomaticallyWithoutConfigFiles() {
        // 创建流程引擎配置对象
        ProcessEngineConfiguration config = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
        // 设置jdbc连接参数信息
        config.setJdbcDriver("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/new_frame_dubbo?useUnicode=true&characterEncoding=utf8");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
        // 设置自动建表
        config.setDatabaseSchemaUpdate("true");
        // 使用配置对象创建流程引擎对象，创建对象过程中会自动建表
        ProcessEngine processEngine = config.buildProcessEngine();
    }


    /**
     * 部署流程
     */
    @Test
    public void startDeployTest(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRepositoryService()
                .createDeployment()
                .name("请假流程：情况一")
                .addClasspathResource("gengduo.bpmn")
                .deploy();
    }



    /**
     * 启动流程实例
     *    可以设置一个流程变量
     */
    @Test
    public void testStartPI(){
        /**
         * 流程变量
         *   给<userTask id="请假申请" name="请假申请" activiti:assignee="#{student}"></userTask>
         *     的student赋值
         */
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("student", "小明");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService()
                .startProcessInstanceById("情况1:1:20004",variables);
    }



    @Test
    public void testFinishTask_Teacher(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("teacher", "我是小明的班主任");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()
                .complete("47505", variables); //完成任务的同时设置流程变量
    }



    /**
     * 在完成班主任审批的情况下，给教务处节点赋值
     */
    @Test
    public void testFinishTask_Manager(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("manager", "我是小明的教务处处长");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()
                .complete("27503", variables); //完成任务的同时设置流程变量
    }

    /**
     * 结束流程实例
     */
    @Test
    public void testFinishTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()
                .complete("30003");
    }



    /**
     *  错误示范
     *  可以设置一个流程变量
     */
    @Test
    public void testStartPIError(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService()
                .startProcessInstanceById("情况1:1:20004");
    }


}
